入門
Pywinauto可以控制Windows,它支持多種Windows控制,基本上可被呼叫的或可選的項目,都能找到對應的句炳並進行操作,非常好用。
Windows自動控制還有一個工具Autoit,這非常好入門,但缺點是支持的控制項並沒有pywinauto多。
測試環境
系統
Windows 7 sp1
python
- python 2.7 - 檔案下載 
- pywin32 - 檔案下載 
- pywinauto - 1 - pip install pywinauto 
- (可選)pyinstaller - 打包成exe時使用 - 1 - pip install pyinstaller 
- 以上模塊安裝完,所產生的相關依賴版本
這邊紀錄是因為之前環境有安裝過相同依賴,但版本不同導致無法打包。
| 1 | altgraph==0.15 | 
輔助工具
- sky+
sky+工具能將選擇的句柄操作,生成pywinauto代碼,直接貼上就可以用了,

- Autoit Windows info
安裝Atoit,這裡頭的小工具autoitinfo可以快速查找窗口句炳。

邊做邊學
連接句柄
- 導入模塊
| 1 | from pywinauto.application import Application | 
- 連接程序
方式一:創建pywinauto對象,開啟並連接notepad.exe程序句柄
| 1 | app = Application().start("notepad.exe") | 
方式二:綁定啟動過程序內的新句柄
這個方法是使用pywinauto對象之下,主要是用在連接另外新開啟的dig,如:說明、開啟/另存檔案等,因為這些不能算是一個主程序。
| 1 | about_dlg = app.window_(title_re = u"另存为") | 
方式三:綁定已開啟的程序句柄
| 1 | app = Application().connect(title_re = "", class_name = "") | 
參數title、class_name可以透過輔助工具查看到
控制
控制心法
程序控制
如果class有中文或字符可以在[]中輸入class_name
| 1 | app."class"."controls" | 
程序內控制項操作
| 1 | app."class"."class"."controls" | 
- 控制目前app下的句柄程序
雖然app只是一個pywinauto的對象,如果要操作還是需要輸入底下connect的class才可以操作。
“class” 為透過pywinauto所開啟的class,這必須是connect過的class否則無法直接進行控制,這部份是需要注意的。
“操作” 為該程序可以控制的所有方式,具體調用方法可以參考官方文檔,由下圖可以看到官方文檔其實已經針對了不同需求,提供了方法。

- 查看app.class內有什麼控制項
| 1 | app."class".print_control_identifiers() | 
這邊以notepad為例進行操作
| 1 | >>> app.notepad.print_control_identifiers() | 
看到Notepad下面有Edit、StatusBar可以控制,要了解控制項的方法就必須得看文檔。
Control Identifiers
這邊是自己操作一些控制項的紀錄
Edit
- TypeKeys() 輸入文字 
 app.notepad.Edit.TypeKeys(“1\thello,hello\rwahaha”)
- SetEditText() 替換文字 
 app.notepad.Edit.SetEditText(“全部都被我換掉…”)
Menu

pywinauto.controls.menuwrapper
- Menu().ItemCount() 計算選單數量
| 1 | >>> app.notepad.Menu().ItemCount() | 
- Menu().Item(“int”).Text() 查看第”int”選單的文字,由0開始為第1個。
| 1 | >>> print app.notepad.Menu().Item(0).Text() | 
控制子選單 SubMenu()
先選擇上層選單,在透過SubMenu()方法控制子選單。
- 方式一:
類似root層級,透過固定的位置逐層選擇,該方法也適用於遍歷尋找指定選單位置。
| 1 | # 上層選單 "文件(&F)" - Menu().Item(0) | 
選擇”另存为(&A)…” - ClickInput()
| 1 | 
 | 
- 方式二
直接選擇已知”選單名”
| 1 | # 方式一的部分這邊一行就可以搞定了。 | 
對話框 dialog

windows中對話框的種類非常多,可以參考下面的連結了解一下。
https://www.blog.pythonlibrary.org/2010/06/26/the-dialogs-of-wxpython-part-1-of-2/
https://www.blog.pythonlibrary.org/2010/07/10/the-dialogs-of-wxpython-part-2-of-2/
連接對話框
| 1 | about_dlg = app.window_(title_re = u"另存为") | 
由於對話框是一個新的窗口,必須先連接後在用print_control_identifiers查看有哪些win32_controls。
| 1 | about_dlg.print_control_identifiers() | 
SysTreeView32
controls.common_controls.TreeViewWrapper
官方文檔中對於每一個物件都做了說明,建議操作時同時參考查閱。
- ItemCount() 列出所有個數
| 1 | >>> about_dlg.SysTreeView32.ItemCount() | 
- PrintItems() 打印所有項目名稱
| 1 | >>> print about_dlg.SysTreeView32.PrintItems() | 
點擊

- 我的最愛\下載
| 1 | >>> about_dlg.SysTreeView32.GetItem(u"\我的最愛\下載").ClickInput() | 
- 桌面\電腦\本機磁碟 (C:)
| 1 | >>> about_dlg.SysTreeView32.Item(u"\桌面\電腦\本機磁碟 (C:)").ClickInput() | 
先展開,再點擊

指定展開 “桌面\電腦\本機磁碟 (C:)”
| 1 | >>> about_dlg.SysTreeView32.GetItem(u"\桌面\電腦\本機磁碟 (C:)").Click(where = | 
打印所有項目名稱
| 1 | >>> print about_dlg.SysTreeView32.PrintItems() | 
點擊 剛剛展開”本機磁碟 (C:)”中的Python27

| 1 | >>> about_dlg.SysTreeView32.Item(u"\桌面\電腦\本機磁碟 (C:)\Python27").ClickInput | 
example
使用心得 - 操作記事本
整理上述實例,開始到結束。
| 1 | # -*- coding: utf8 -*- | 
小結
盡可能參考官方文檔查詢控制方法,找class名稱或底下控制項,可以使用autoitinfo、spy+取得名稱,開發過程使用交互模式調試非常方便。
參考